package com.kx.springmvc.controller;

import com.kx.springmvc.pojo.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * @ClassName UserServlet
 * @Author Sun
 * @Date 2021/5/19 14:03
 */
@Controller
@RequestMapping("/user")
public class UserController {

    /**
     * 获取参数的方式 1,以前是通过 HttpServletRequest
     */
    @RequestMapping("/getparams1")
    public void getParams1(HttpServletRequest req){
        String username = req.getParameter("username");
        System.out.println(username);
    }

    /**
     * 获取参数的方式 2,要求方法的形参的名字和请求参数的名字保持一致即可
     * 假如说当前方法传递的参数是 username(String) 和 password(String) 和 age(int)
     * @RequestParam(required = true)  来指定请求参数的一些设置,比如必须传递,或者是设置默认值 ,
     * name 的意思是如果传递的参数名和我们的形参名字不一致则可以通过它来指定,但是我们作为服务端是可以定义参数名的,所以不需要name
     */
    @RequestMapping("/getparams2")
    public void getParams2(String username ,@RequestParam(required = true,name = "pwd") String password,@RequestParam(defaultValue = "18") int age){
        System.out.println(username+password+age);
    }


    /**
     * 获取请求参数的方式 3: 用一个对象来接收参数,要求对象的属性名必须和请求参数的参数名保持一致
     */
    @RequestMapping("/getparams3")
    public void getParams3(User user){
        System.out.println(user);
    }

    /**
     *如果请求参数是日期 默认是 yyyy/MM/dd 格式
     * @param birthday
     **/
    @RequestMapping("/getparams4")
    public void getParams4(Date birthday){
        System.out.println(birthday);
    }

    /**
     * 可以通过注解来修改这个格式@DateTimeFormat
     * @param birthday
     */
    @RequestMapping("/getparams5")
    public void getParams5(@DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday) {
        System.err.println(birthday);
    }

    /**
     * PathVariable 指定我们请求路径中的某个参数和当前方法的形参进行对应,要求方法的形参名字必须和{}中的占位符的名字保持一致
     * @param name
     */
    @RequestMapping("/getparams6/{name}")
    public void getParams6(@PathVariable String name){
        System.out.println(name);
    }

    /**
     * 如果要使用这个路径化的参数,那么参数必须传递,不可以少,少了就会出现 404
     * @param name
     * @param age
     */
    @RequestMapping("/getparams7/{age}/{name}")
    public void getParams7(@PathVariable String name,@PathVariable int age){
        System.out.println(name);
    }

    /**
     * RequestBody 请求正文,作用是将请求正文中的数据解析为指定的对象
     * 需要在配置文件中指定mvc解析的格式 <mvc:annotation-driven/> 解析数据为json
     * @param user
     **/
    @RequestMapping("/getparams8")
    public void getParam8(@RequestBody User user){
        System.out.println(user);
    }
}
